home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / networke / civ-0.000 / civ-0 / civ-0.3 / src / world.h < prev    next >
C/C++ Source or Header  |  1995-11-12  |  6KB  |  195 lines

  1. #ifndef _WORLD_H
  2. #define _WORLD_H
  3.  
  4. #include "mytypes.h"
  5. #include "graph.h"
  6. #include "array.h"
  7. #include "list.h"
  8.  
  9. class Rivers;
  10.  
  11. class City;
  12.  
  13. // the first 4 bits give the terrain type
  14. // LAND is only used to make the world after that it is replaced
  15. // by the right type
  16. enum { WATER = 0, LAND, MOUNTAINS, HILLS, DESERT,
  17.        SWAMP, PLAINS, GRASS, GRASS1, FOREST, JUNGLE, RIVER,
  18.        LAST_TERRAIN_TYPE };
  19. const ushort TERRAIN = 0x0f; // use this mask to get the terrain type
  20.  
  21. // depends on terrain type
  22. // forest -> game, hills -> coal, jungle -> gems, mountains -> gold
  23. // plains -> horses, swamp -> oil, desert -> oasis
  24. const ushort GOODIE = 0x10;
  25. const ushort ROAD = 0x20;
  26. const ushort IRRIG = 0x40;
  27. const ushort RAILROAD = 0x80;
  28. const ushort MINED = 0x100;
  29. const ushort POLLUTED = 0x200;
  30.  
  31. const int HorizSpace = 64;
  32. const int VertSpace = 8;
  33.  
  34. const int SquareWidth = 16;
  35. const int SquareHeight = 16;
  36.  
  37. const int SquaresWide = (ScreenWidth-HorizSpace)/SquareWidth;
  38. const int SquaresHigh = (ScreenHeight-VertSpace)/SquareHeight;
  39.  
  40. class MsgQ;
  41.  
  42. class World
  43. {
  44. public:
  45.   World(int MaxX, int MaxY, int ContDist, int ChunkSize, int NumChunks,
  46.     int LandPercent, int NumRivers, int RiverLength);
  47.   World(MsgQ *); // get the world from the message Q
  48.   World(); // read from save file
  49.   ~World();
  50.  
  51.   void Save(); // save to save file
  52.  
  53.   void AllocColors();
  54.  
  55.   int What(int x, int y) { return world(x,y); }
  56.   void Set(int x, int y, int what) { world(x,y) = what; }
  57.  
  58.   int Terrain(int x, int y) { return What(x, y) & TERRAIN; }
  59.  
  60.   int IsGoodie(int x, int y) { return world(x, y) & GOODIE; }
  61.  
  62.   // if there are any units then the first will be drawn
  63.   // if there is a city it will be drawn
  64.   // otherwise the terrain is drawn
  65.   void Draw(int x, int y);
  66.   void Draw(int x, int y, int cols, int rows, int atx, int aty);
  67.  
  68.   // same as Draw except that we only draw one square and units
  69.   // are ignored
  70.   void DrawBase(int x, int y, int atx, int aty);
  71.  
  72.   int MaxX() { return maxX; }
  73.   int MaxY() { return maxY; }
  74.  
  75.   void Send(); // send the world over the socket
  76.  
  77.   void MakeVisible(int x, int y)
  78.     { visible(x,y) = visible(x,y) == 0 ? 2 : visible(x,y)+1; }
  79.   void LoseVisible(int x, int y)
  80.     { --visible(x,y); }
  81.  
  82.   // zone-of-control stuff
  83.   int OpponentPresent(int player, int x, int y);
  84.   int NextToOpponent(int player, int x, int y);
  85.  
  86.   // how much around you is visible
  87.   void SeeSquare(int x, int y, int side = 1);
  88.   void HideSquare(int x, int y, int side = 1);
  89.  
  90.   double SquareDefense(int x, int y, int attacker);
  91.  
  92.   // returns true if you can see enemy units in that square
  93.   int Visible(int x, int y) { return visible(x,y) > 1; }
  94.   // returns real visibility
  95.   int RealVisible(int x, int y) { return visible(x, y); }
  96.  
  97.   List<ulong> &Units(int x, int y) { return units(x,y); }
  98.  
  99.   ulong &WhichCity(int x, int y) { return cities(x,y); }
  100.  
  101.   // returns the id of the city who is working on this square
  102.   // is 0 if no city is using it
  103.   ulong &Working(int x, int y) { return working(x, y); }
  104.  
  105.   // color the main map
  106.   void MarkSquare(int x, int y, int c);
  107.  
  108.   void DrawMainMap(); // redraws the main map
  109.  
  110.   int WaterColor() { return waterColor; }
  111.   int LandColor() { return landColor; }
  112.  
  113.   int Food(int x, int y, int player);
  114.   int Prod(int x, int y, int player);
  115.   int Trade(int x, int y, int player);
  116.  
  117.   int IsRoad(int x, int y) { return What(x, y) & ROAD; }
  118.   void MakeRoad(int x, int y);
  119.  
  120.   int IsRailRoad(int x, int y) { return world(x, y) & RAILROAD; }
  121.   void MakeRailRoad(int x, int y);
  122.  
  123.   int Irrigated(int x, int y) { return What(x, y) & IRRIG; }
  124.   void Irrigate(int x, int y);
  125.  
  126.   int Mined(int x, int y) { return world(x, y) & MINED; }
  127.   void Mine(int x, int y);
  128.  
  129.   int Polluted(int x, int y) { return world(x, y) & POLLUTED; }
  130.   void Pollute(int x, int y);
  131.   void UnPollute(int x, int y);
  132.  
  133.   void DrawSquare(int wx, int wy, int xc, int yc);
  134.  
  135.   int FixX(int x) { return (x+maxX)%maxX; }
  136.   int FixY(int y) { return (y+maxY)%maxY; }
  137.  
  138.   int IrrigTime(int x, int y);
  139.   int RoadTime(int x, int y);
  140.   int RailRoadTime(int x, int y);
  141.   int MineTime(int x, int y);
  142.   int UnPolluteTime(int x, int y);
  143.  
  144. private:
  145.   typedef List<ulong> LongList;
  146.  
  147.   Array<ushort> world;
  148.   Array<LongList> units;
  149.   Array<ulong> cities;
  150.   Array<ulong> working;
  151.  
  152.   Rivers *rivers;
  153.  
  154.   // if 0 then black, if it is 1 we draw the terrain, bigger than
  155.   // that we draw any units there too
  156.   Array<uchar> visible;
  157.  
  158.   int maxX, maxY;
  159.  
  160.   static char **pictures[LAST_TERRAIN_TYPE];
  161.   static char **goodiePics[LAST_TERRAIN_TYPE];
  162.   static long compiledPictures[LAST_TERRAIN_TYPE];
  163.   static long compiledGoodies[LAST_TERRAIN_TYPE];
  164.  
  165.   static double terrainDefense[LAST_TERRAIN_TYPE];
  166.  
  167.   static long minedPic;
  168.   static long irrigPic;
  169.   static long roadPic;
  170.   static long railPic;
  171.   static long polluPic;
  172.   static long basketPic;
  173.   static long fishPic;
  174.   static long rivgoodPic;
  175.  
  176.   static int waterColor, landColor, blackColor;
  177.  
  178.   void GrowChunk(int &xp, int &yp, int type);
  179.   int Verify(int x, int y, int dist, int type, int where);
  180.   void NewChunk(int &xp, int &yp, int dist, int type, int where);
  181.   int MakeChunk(int x, int y, int dist, int type);
  182.   int MakeTerrain(int max, int percent, int NumChunks, int ChunkSize,
  183.            int ContDist, int type, int where);
  184.  
  185. // MarkM changed GivesWater to not give water from city hexes, because
  186. // he also made city hexes on clearish terrain automatically irrigated.
  187.   int GivesWater(int x, int y)
  188.     { return (Irrigated(x, y) && !cities(x, y))
  189.         || Terrain(x, y) == WATER || Terrain(x, y) == RIVER;
  190.     }
  191.  
  192. };
  193.  
  194. #endif
  195.